home *** CD-ROM | disk | FTP | other *** search
GW-BASIC | 1984-04-24 | 8.9 KB | 236 lines |
- 1 '*********************************************************************
- 2 '* PC-MAP. This program recreates a PC-File database into a new *
- 3 '* Format. Fields may be added or deleted, renamed, *
- 4 '* rearranged, and lengthened or shortened. Output is a *
- 5 '* Data file and Header file. After using PC-File to *
- 6 '* sort the file (thus creating a new index), the new *
- 7 '* database is ready to go. *
- 8 '* (1982) by F. Neil Lamka. *
- 9 '*********************************************************************
- 10 DEFINT A-Z:COMMON F$,DL,XL,NR
- 20 CLS:RC=80
- 25 ERCOUNT = 0
- 30 FALSE=0:TRUE=1
- 40 MC=RC\2:F9=RC\2+2
- 50 SCREEN 0,0:COLOR 7,0
- 60 WIDTH RC:KEY OFF
- 70 DIM OFM$(42),OFL(42) 'set up arrays for field names and lengths
- 80 DIM NFM$(42),NFL(42) 'set up arrays for new data base
- 90 CLS:LOCATE 10,MC-9:PRINT"PC-MAP Version 1.4";
- 95 LOCATE 12,MC-17:PRINT"A PC-FILE Data Base Conversion Aid";
- 100 LOCATE 14,MC-11:PRINT"(1982) F. Neil Lamka"
- 110 DR$="Which drive (ABCD) contains the origional data base? "
- 120 CL = 0
- 130 UC=1:GOSUB 20000
- 140 IF DR$<"A" OR DR$>"D" GOTO 110
- 150 OF$ = DR$+":" 'set file name for old data base
- 155 TF$=OF$
- 160 DR$="Which drive (ABCD) will contain the new data base? "
- 170 CL = -3 'set value for message color (15-3)
- 180 UC=1:GOSUB 20000
- 190 CL = 0 'reset line color value
- 200 IF DR$<"A" OR DR$>"D" GOTO 160
- 210 NF$ = DR$+ ":" 'set file name for new data base
- 220 ON ERROR GOTO 250
- 230 CLS:LOCATE 5,1:PRINT"Choose one of these files to convert:"
- 240 FILES OF$+"*.HDR":GOSUB 30000:ON ERROR GOTO 0:GOTO 260
- 250 RESUME 260
- 260 DR$="Which file:":UC=1:GOSUB 20000
- 270 IF DR$="" THEN 260 ELSE OF$ = TF$ + DR$ 'set file name to be used
- 280 ON ERROR GOTO 330
- 290 VL$=".HDR":FILES OF$+VL$ 'see if the hdr file exists
- 300 VL$=".DTA":FILES OF$+VL$ 'see if the data file exists
- 310 ON ERROR GOTO 0
- 320 CLS:GOTO 360 'go get new file name
- 330 RESUME 340
- 340 ON ERROR GOTO 0:DR$=OF$+VL$+" does not exist...please respecify: "
- 341 CL=-4:UC=1:SOUND 500,9:GOSUB 20000:CL=0
- 342 IF DR$="" THEN 260 ELSE OF$=TF$+DR$
- 350 GOTO 280
- 360 TF$=NF$
- 365 DR$="Enter name for new data base: ":CL= -3:UC=1:GOSUB 20000
- 370 IF DR$="" THEN 360 ELSE NF$=NF$+DR$ 'set new data base name
- 375 IF NF$=OF$ THEN DR$="INVALID NAME - SAME AS THE FIRST ONE - RESPECIFY ":NF$=TF$:UC=1:CL=-4:SOUND 500,4:GOSUB 20000:CL=0:GOTO 370
- 380 ON ERROR GOTO 440
- 400 VL$=".HDR":FILES NF$+VL$ 'see if a hdr file exists
- 410 CLS:DR$=NF$+VL$+" already exists...respecify or hit ENTER to reuse: "
- 415 ON ERROR GOTO 0
- 420 UC=1:CL=-4:SOUND 500,4:GOSUB 20000:CL=0
- 430 IF DR$="" THEN KILL NF$+VL$:GOTO 450 ELSE NF$=TF$+DR$:GOTO 380
- 440 RESUME 450 'if we get here then the files did not exist
- 450 ON ERROR GOTO 0
- 452 ON ERROR GOTO 462:VL$=".DTA":FILES NF$+VL$
- 454 CLS:DR$=NF$+VL$+" already exists...respecify or hit ENTER to reuse: "
- 456 ON ERROR GOTO 0
- 458 UC=1:CL=-3:SOUND 500,9:GOSUB 20000:CL=0
- 460 IF DR$="" THEN KILL NF$+VL$:GOTO 464 ELSE NF$=TF$+DR$:GOTO 380
- 462 RESUME 464 'files did not exist if we are here
- 464 ON ERROR GOTO 0
- 500 REM All files have been verified...now start the work
- 510 ODL=0:ODF=0 'set record length and number of entries in old db
- 520 NDL=0:NDF=0 'set record length and number of entries in new db
- 530 CLS
- 540 PRINT"Reading origional data base records ";MID$(OF$,3)
- 550 OPEN"i",#1,OF$+".HDR" 'open old header file
- 560 WHILE NOT EOF(1) 'read old data base header description
- 570 INPUT#1,TS$:ODF =ODF + 1:OFM$(ODF) = TS$ 'read label
- 580 INPUT#1,OFL(ODF):ODL = ODL + OFL(ODF)
- 590 WEND 'end of the loop
- 595 CLOSE#1 'done with the old header file
- 600 CLS:LOCATE 2,1:PRINT "Origional Data Base Fields";
- 602 LOCATE 3,1:PRINT OF$+".HDR";
- 605 LC=4:MAXLEN = 0
- 610 LOCATE LC,1
- 620 FOR I = 1 TO ODF
- 630 IF OFL(I) > MAXLEN THEN MAXLEN=OFL(I)
- 635 LOCATE LC+I,1:PRINT OFM$(I);:PRINT,USING" ###";OFL(I)
- 640 NEXT I
- 650 IF MAXLEN+3+2 <= 40 THEN NEXTFIELD=40 ELSE NEXTFIELD=0
- 700 LOCATE 1,1:COLOR 12,0:SOUND 800,4:PRINT"Enter values for the new headers";
- 703 LOCATE 2,NEXTFIELD:COLOR 15,0:PRINT"New Data Base fields";
- 705 LOCATE 3,NEXTFIELD:PRINT NF$+".HDR";
- 710 ATLINE = 1:NDF=0:NEWEND = FALSE
- 715 CURMAX = 12:COLOR 15,0
- 720 WHILE NEWEND = FALSE
- 725 IF ATLINE+LC >24 THEN GOSUB 10000:ATLINE = 1
- 730 LOCATE ATLINE+LC,NEXTFIELD
- 740 LINE INPUT;"";TS$:IF TS$="" THEN NEWEND=TRUE:GOTO 750 ELSE NDF=NDF+1:NFM$(NDF) = TS$
- 741 IF LEN(NFM$(NDF)) > 12 THEN NFM$(NDF)=LEFT$(NFM$(NDF),12):LOCATE ATLINE+LC,NEXTFIELD:PRINT NFM$(NDF)+SPACE$(LEN(TS$)-12);
- 745 ATLINE = ATLINE + 1
- 750 WEND:COLOR 7,0
- 752 DR$="Is this HDR information correct (Y or N)? ":UC=1:CL=0:GOSUB 20000
- 753 IF DR$="" THEN 752 ELSE IF DR$ = "N" THEN GOSUB 40000:GOTO 710 ELSE IF DR$ <> "Y" THEN 752
- 759 NDL=0:LOCATE 1,1:PRINT" "
- 760 LOCATE 1,40:COLOR 12,0:PRINT"Enter the width of each field ";:COLOR 4,0
- 765 SOUND 800,5
- 770 FOR I = 1 TO NDF
- 780 LOCATE LC+I,NEXTFIELD+CURMAX+1
- 790 LINE INPUT;"";TS$:NFL(I)=VAL(TS$):NDL=NDL+NFL(I)
- 792 IF NFL(I) = 0 THEN LOCATE 25,1:PRINT"Spceified field length is not valid..Please reenter";:SOUND 500,9:GOTO 780
- 795 LOCATE LC+I,NEXTFIELD+CURMAX+1:PRINT,USING"###";NFL(I)
- 796 LOCATE 25,1:PRINT" ";
- 800 NEXT I
- 802 DR$="Is this field width information correct (Y or N)? ":UC=1:CL=0:GOSUB 20000
- 803 IF DR$="" THEN 802 ELSE IF DR$ = "N" THEN GOSUB 50000:GOTO 759 ELSE IF DR$ <> "Y" THEN 802
- 810 COLOR 7,0
- 900 CLS 'now that the data fields have been defined...we need relationships
- 910 LOCATE 1,1:PRINT"Define field relationship values";
- 920 LOCATE 2,1:PRINT"For each field in the new data base indicate the";
- 930 LOCATE 3,1:PRINT"corresponding old data base field number or 0";
- 940 LOCATE 4,1
- 950 FOR I = 1 TO NDF 'output new data fields
- 960 LOCATE 4+I,1:PRINT NFM$(I);
- 980 NEXT I
- 990 FOR I = 1 TO ODF 'output old data base fields
- 1000 LOCATE 4+I,50:PRINT OFM$(I)
- 1005 LOCATE 4+I,30:PRINT,USING"###";I;
- 1010 NEXT I
- 1015 DIM FR(42) 'set the size of the relationship matrix to the # of data flds
- 1020 FOR I = 1 TO NDF 'get field relationship value
- 1030 LOCATE 4+I,25
- 1040 LINE INPUT;"";TS$:IF TS$ = "" THEN 1030
- 1050 IF (VAL(TS$) > ODF) OR (VAL(TS$) < 0) THEN LOCATE 25,1:PRINT"Invalid field relationship specified";:SOUND 500,9:GOTO 1030
- 1060 LOCATE 25,1:PRINT" ";
- 1070 FR(I) = VAL(TS$) 'set the field relationship matrix value
- 1080 NEXT I
- 1082 DR$="Are these field relationships correct (Y or N)? ":CL=0:UC=1:GOSUB 20000
- 1084 IF DR$="" THEN 1082 ELSE IF DR$="N" THEN GOSUB 60000:GOTO 1020 ELSE IF DR$ <> "Y" THEN 1082
- 1100 CLS 'now we have all we need to remap the data base
- 1110 DIM OFILE$(42),NFILE$(42) 'set up to map the data base
- 1120 CLS:PRINT"Writing new HDR file ";:COLOR 12,0
- 1130 PRINT NF$+".HDR":COLOR 7,0
- 1140 OPEN"o",#1,NF$+".HDR"
- 1150 FOR I = 1 TO NDF 'loop until end of header info
- 1160 PRINT#1,NFM$(I) 'write out the header name
- 1170 PRINT#1,NFL(I) 'write out the field lenght
- 1180 NEXT I
- 1190 CLOSE#1 'close the new header file
- 1200 PRINT"New Header file created"
- 1210 REM open the DTA data sets for processing
- 1220 OPEN"r",#2,OF$+".DTA",ODL+1
- 1230 FIELD#2,ODL AS ODF$ 'set up a field for direct read
- 1240 OPEN"r",#3,NF$+".DTA",NDL+1
- 1250 FIELD#3,NDL AS NDF$ 'this will be the outputfield
- 1260 X = 1 'set initial record number
- 1265 FEND = FALSE
- 1270 WHILE FEND = FALSE 'read until \ record found in data base
- 1280 GET#2,X 'read record from the old data base
- 1290 IF LEFT$(ODF$,1) = "\" THEN FEND=TRUE:DR$="\":GOTO 1400
- 1295 'IF LEFT($(ODF$,2)="//" THEN GOTO 1408 check for deleted record
- 1300 CPOS = 1 'map old data record to array
- 1310 FOR I = 1 TO ODF
- 1320 OFILE$(I)=MID$(ODF$,CPOS,OFL(I)):CPOS=CPOS+OFL(I)
- 1330 NEXT I
- 1340 FOR J = 1 TO NDF
- 1350 IF FR(J)=0 THEN NFILE$(J)=SPACE$(NFL(J)):GOTO 1372
- 1362 IF NFL(J)<=OFL(FR(J)) THEN NFILE$(J)=LEFT$(OFILE$(FR(J)),NFL(J)):GOTO 1372
- 1364 IF NFL(J)>OFL(FR(J)) THEN NFILE$(J)=OFILE$(FR(J))+SPACE$(NFL(J)-OFL(FR(J)))
- 1372 NEXT J
- 1375 DR$=""
- 1376 FOR K=1 TO NDF:DR$=DR$+LEFT$(NFILE$(K),NFL(K)):NEXT K
- 1400 LSET NDF$=DR$:PUT#3,X 'write the new record
- 1401 CLS:LOCATE 1,1:PRINT"Processing record number(",X,")";
- 1402 LOCATE 2,1:PRINT"New File Record";
- 1403 LOCATE 2,40:PRINT"Old File Record";
- 1406 FOR K = 1 TO NDF:LOCATE 3+K,1:PRINT NFILE$(K);:NEXT K
- 1407 FOR K = 1 TO ODF:LOCATE 3+K,40:PRINT OFILE$(K);:NEXT K
- 1408 X=X+1
- 1410 WEND
- 1420 CLOSE#2:CLOSE#3
- 1500 CLS 'output final file stats
- 1510 LOCATE 8,28:PRINT"File conversion complete";
- 1520 LOCATE 9,28:PRINT"Data Base Statistics are";
- 1530 LOCATE 11,1 :PRINT"Origional Data Base = ";:LOCATE 11,30:PRINT OF$;
- 1550 LOCATE 12,1:PRINT"Origional number of fields = ";:LOCATE 12,30:PRINT ODF;
- 1552 LOCATE 13,1:PRINT"Record Length = ";:LOCATE 13,30:PRINT ODL;
- 1555 COLOR 15,0
- 1560 LOCATE 15,1:PRINT"New Data Base = ";:LOCATE 15,30:PRINT NF$;
- 1570 LOCATE 16,1:PRINT"New number of fields = ";:LOCATE 16,30:PRINT NDF;
- 1580 LOCATE 17,1:PRINT"New Total Record Length = ";:LOCATE 17,30:PRINT NDL;
- 1590 LOCATE 20,1:PRINT"Number of Data Records Read = ",X-1;
- 1600 COLOR 7,0
- 1610 GOSUB 60990 'go wait for input key to continue
- 1615 CLS:PRINT"Your new database is built."
- 1620 PRINT:PRINT"You must remember to sort the database"
- 1625 PRINT:PRINT"the first time you use it."
- 1640 END
- 10000 FOR LP = LC+1 TO 24
- 10010 LOCATE LP,NEXTFIELD:PRINT SPC(79-NEXTFIELD)
- 10020 NEXT LP
- 10030 RETURN
- 20000 GOSUB 20110
- 20010 SOUND 200,9
- 20020 LOCATE 25,1:COLOR 15+CL,0
- 20030 PRINT DR$;:COLOR 7,0
- 20040 LINE INPUT;"";DR$
- 20050 IF LEN(DR$)<1 GOTO 20110
- 20060 IF UC=0 GOTO 20110
- 20070 FOR NN = 1 TO LEN(DR$) 'fold to upper case
- 20080 X=ASC(MID$(DR$,NN,1))
- 20090 IF X>=97 AND X <= 122 THEN MID$(DR$,NN,1)=CHR$(X-32)
- 20100 NEXT:UC = 0
- 20110 LOCATE 25,1:PRINT SPACE$(RC-1);:LOCATE 25,1:RETURN
- 30000 FOR R = 6 TO 24
- 30010 FOR C = 9 TO RC-2 STEP 13
- 30020 LOCATE R,C:PRINT" ";
- 30030 NEXT C:NEXT R
- 30040 RETURN
- 40000 FOR I = 1 TO NDF 'routine called if new field names incorrect
- 40010 NFM$(I) = ""
- 40020 LOCATE LC+I,NEXTFIELD:PRINT SPC(RC-NEXTFIELD);
- 40030 NEXT I
- 40040 RETURN
- 50000 FOR I = 1 TO NDF 'routine to be called if new field width incorrect
- 50020 NFL(I)=0
- 50025 LOCATE LC+I,NEXTFIELD+CURMAX+1:PRINT,USING"###";NFL(I);
- 50030 NEXT I
- 50040 RETURN
- 60000 FOR I = 1 TO NDF 'routine to be used if relationship vals incorrect
- 60010 LOCATE 4+I,25:PRINT SPC(5)
- 60020 FR(I) = 0
- 60030 NEXT I
- 60040 RETURN
- 60990 REM 'Wait for input key subroutine
- 60991 LOCATE 25,1:PRINT"Hit any key to continue";
- 60992 K$=INKEY$:IF K$="" THEN 60992 ELSE RETURN
-